/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package CONTABILIDAD_CONTROLADOR;

import CONTABILIDAD_MODELO.CON_AJUSTE_REDONDEO;
import CONTABILIDAD_MODELO.CON_CENTRO_COSTO;
import CONTABILIDAD_MODELO.CON_CENTRO_SUC_REG_DEP;
import CONTABILIDAD_MODELO.CON_CUENTA_CONTABLE;
import Conexion.Conexion;
import Modelo.SIS_VERSION;
import RRHH_Modelo.RHH_USUARIO;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author equipo_2
 */
@WebServlet(name = "CON_VISTA_ESTADO_CUENTAS_CONTROLLER", urlPatterns = {"/CON_VISTA_ESTADO_CUENTAS_CONTROLLER"})
public class CON_VISTA_ESTADO_CUENTAS_CONTROLLER extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
           
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        try {
            String proceso=request.getParameter("proceso");
            RHH_USUARIO usuario = ((RHH_USUARIO)request.getSession().getAttribute("usr"));
            Conexion con = new Conexion(usuario.getUSUARIO(), usuario.getPASSWORD());
            String html="";
            switch(proceso)
            {
                case "version":
                    html=version(request, con);
                    break; 
                case "cargarCuenta":
                    html=cargarCuenta(request, con);
                    break;
                case "totalCuenta":
                    html=totalCuenta(request, con)+"]";
                    break;
                case "busquedaNivel":
                    html=busquedaNivel(request, con);
                    break;
            }
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(html);
            con.Close();
        } catch (SQLException ex) {
            Logger.getLogger(CON_VISTA_ESTADO_CUENTAS_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
     public String version(HttpServletRequest request, Conexion con) {
        try {
            SIS_VERSION version = new SIS_VERSION(con);
            String cuenta = version.getVersion("cuentaCodigo");
            String centro = version.getVersion("centroCodigo");
            return "{\"cuenta\":\"" + cuenta + "\",\"centro\":\"" + centro + "\"}";
        } catch (SQLException ex) {
            return "{\"cuenta\":0,\"centro\":0}";
        }
    }
    private int cuentasize = 0;

    public String cuentas(HttpServletRequest request, Conexion con) throws SQLException {
        int vCuenta = Integer.parseInt(request.getParameter("cuenta"));
        CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
        if (vCuenta == -1) {
            String json = cuenta.generarListacontable("CODIGO");
            return json;
        }
        SIS_VERSION version = new SIS_VERSION(con);
        List<SIS_VERSION> VersionCuenta = version.getUltimaVersion("cuentaCodigo");

        cuentasize = VersionCuenta.size();
        String cuentaStr = "{";
        for (int i = vCuenta; i < VersionCuenta.size(); i++) {
            cuenta = cuenta.BuscarXid(VersionCuenta.get(i).getID_CUENTA());
            if(cuenta==null && !VersionCuenta.get(i).getACCION().equals("E"))continue;
            if (VersionCuenta.get(i).getACCION().equals("E")) {
                cuentaStr += "\"c" + cuenta.getID() + "\":{\"CODIGO\":\"na\", \"NIVEL\":\"na\", \"id\":\"" + cuenta.getID() + "\", \"DESCRIPCION\":\"na\", \"MONEDA\":\"na\"},";
                continue;
            }
            cuentaStr += "\"c" + cuenta.getID() + "\":{\"CODIGO\":\"" + cuenta.getCODIGO() + "\", \"NIVEL\":\"" + cuenta.getID_NIVEL() + "\", \"id\":\"" + cuenta.getID() + "\", \"DESCRIPCION\":\"" + cuenta.getDESCRIPCION() + "\", \"MONEDA\":\"" + cuenta.getID_MONEDA() + "\"},";
        }
        if (cuentaStr.length() == 1) {
            return "[]";
        }
        cuentaStr = cuentaStr.substring(0, cuentaStr.length() - 1) + "}";
        return cuentaStr;
    }
    private int centrosize = 0;

    public String centroCosto(HttpServletRequest request, Conexion con) throws SQLException {
        CON_CENTRO_COSTO centro = new CON_CENTRO_COSTO(con);
        int vCentro = Integer.parseInt(request.getParameter("centro"));
        if (vCentro == -1) {
            String json = centro.generarListaHojasdescripcion("CODIGO");
            return json;
        }
        SIS_VERSION version = new SIS_VERSION(con);
        List<SIS_VERSION> VersionCentro = version.getUltimaVersion("centroCodigo");
        centrosize = VersionCentro.size();
        String centroStr = "{";
        for (int i = vCentro; i < VersionCentro.size(); i++) {
            centro = centro.BuscarXid(VersionCentro.get(i).getID_CENTRO_COSTO());
            if(centro==null && !VersionCentro.get(i).getACCION().equals("E")){
                continue;
            }
            double id = VersionCentro.get(i).getID_CENTRO_COSTO();
            if (VersionCentro.get(i).getACCION().equals("E")) {
                centroStr += "\"cc" + (int) id + "\":{\"CODIGO\":\"na\", \"DESCRIPCION\":\"na\", \"NIVEL\":\"na\", \"tipo\":\"na\", \"id\":\"" + (int) id + "\", \"IDCUENTA\":\"na\"},";
                continue;
            }
            CON_CENTRO_SUC_REG_DEP ccrd = new CON_CENTRO_SUC_REG_DEP();
            ccrd.setCon(con);

            List<CON_CENTRO_SUC_REG_DEP> listaccr = ccrd.BuscarXid(id);
            String tipo = "";
            if (listaccr.size() == 0) {
                tipo = "ccnormal";
            } else {
                if (listaccr.get(0).getID_DEPTO() != 0) {
                    tipo = "ccdepto";
                }
                if (listaccr.get(0).getID_REGIONAL() != 0 && listaccr.get(0).getPORCENTAJE_REGIONAL() == -1) {
                    tipo = "ccregional";
                }
                if (listaccr.get(0).getPORCENTAJE_REGIONAL() > 0) {
                    tipo = "ccrnacional";
                }
                if (listaccr.get(0).getPORCENTAJE_SUCURSAL() == -1) {
                    tipo = "ccsucursal";
                }
                if (listaccr.get(0).getPORCENTAJE_SUCURSAL() > 0) {
                    tipo = "ccTsucursal";
                }
            }
            centroStr += "\"cc" + (int) id + "\":{\"CODIGO\":\"" + centro.getCODIGO() + "\", \"DESCRIPCION\":\"" + centro.getDESCRIPCION() + "\", \"NIVEL\":\"" + centro.getID_NIVEL_CENTRO_COSTO() + "\", \"tipo\":\"" + tipo + "\", \"id\":\"" + (int) id + "\", \"IDCUENTA\":\"" + centro.getID_CUENTA_CONTABLE() + "\"},";
        }
        if (centroStr.length() == 1) {
            return "[]";
        }
        centroStr = centroStr.substring(0, centroStr.length() - 1) + "}";
        return centroStr;
    }

    public String cargarCuenta(HttpServletRequest request, Conexion con) {
        try {
            String cuenta = cuentas(request, con);
            String centro = centroCosto(request, con);
            return "{\"cuenta\":" + cuenta + ",\"centro\":" + centro + ",\"versioncuenta\":\"" + cuentasize + "\", \"versioncentro\":\"" + centrosize + "\"}";
        } catch (SQLException ex) {
            return "[]";
        }
    }
    public String totalCuenta(HttpServletRequest request, Conexion con ) throws SQLException{
        CON_CUENTA_CONTABLE cuenta=new CON_CUENTA_CONTABLE(con);
        cuenta.setCon(con);
        
        int mes=Integer.parseInt(request.getParameter("mes"));
        int año=Integer.parseInt(request.getParameter("año"));                  
                        
        String de=request.getParameter("desde");
        String hasta=request.getParameter("hasta");
        tipo=request.getParameter("tipo");
        tipo2=request.getParameter("tipo2");
        int tipo3=0;
        if(de.equals("") || hasta.equals(""))
            tipo3 = 0;
        else
            tipo3=1;
        
        
        String html="[";
        List<String> lista = new ArrayList<String>();
        List<Double> listasum = new ArrayList<Double>();
        if(tipo3==1)
        html += CuentasTotales(de, hasta, con, lista, listasum);
        else
        {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.MONTH, mes-1);
            cal.set(Calendar.YEAR, año);
            cal.set(Calendar.DAY_OF_MONTH, 1);
            int dia = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
            String smes="";
            if(mes>=10)
                smes=mes+"";
            else
                smes="0"+mes;
        
            de=("01/"+mes+"/"+año);
            hasta=dia+"/"+mes+"/"+año;        
            html += CuentasTotales(de, hasta, con, lista, listasum);
        }       
        return html;
    }
    private String tipo2;
    private String tipo;
    public String CuentasTotales(String de, String hasta, Conexion con, List<String> lista, List<Double> listasum) throws SQLException
    {
        Double totalfinal=0.0;
        String html="";
        String consulta ="SELECT "+tipo2+",\n" +
                        "SUM(DEBE) as DEBE,\n" +
                        "SUM(HABER) as HABER\n" +
                        "FROM BROKER."+tipo+"\n" +
                        "WHERE (FECHA BETWEEN TO_DATE ('"+de+"', 'DD/MM/YYYY')\n" +
                        "AND TO_DATE ('"+hasta+"', 'DD/MM/YYYY')) GROUP BY ("+tipo2+")";
        ResultSet rs = con.EjecutarConsulta(consulta);
        
        while(rs.next())
        {
            String codigo = rs.getString(tipo2);            
            StringTokenizer token = new StringTokenizer(codigo, "-");
            Double monto = rs.getDouble("HABER")-rs.getDouble("DEBE");
            String actual =token.nextToken();
            while(token.hasMoreTokens())
            {                
                if(lista.contains(actual))
                {
                    int i = lista.indexOf(actual);
                    listasum.set(i, listasum.get(i)+monto);
                }
                else
                {
                    lista.add(actual);
                    listasum.add(monto);
                }
                actual += "-"+token.nextToken();
            }           
            if(lista.contains(actual))
            {
                int i = lista.indexOf(actual);
                listasum.set(i, listasum.get(i)+monto);
            }
            else
            {
                lista.add(actual);
                listasum.add(monto);
            }
                        
        }
        
        for (int i = 0; i < lista.size(); i++) {            
            html+="{\"CODIGO\":\""+lista.get(i)+"\",\"TOTAL\":";
            double tot = listasum.get(i);
            if(tot>=0)
                html+="\"<span style=' width:120px; text-align:center; display: inline-block'>"+CON_AJUSTE_REDONDEO.truncarDecimal(tot)+"</span>\"},";
            else
                html+="\"<span style=' width:120px; text-align:center; display: inline-block'>("+CON_AJUSTE_REDONDEO.truncarDecimal((tot*-1))+")</span>\"},";
            
            totalfinal+=tot;
        }
        if (html.length()!=0) 
        {
            html = html.substring(0,html.length()-1);
        }
        if (totalfinal>0) 
            return "{\"VALORES\":["+html+"], \"TOTALFINAL\":\"<span  style=' width:120px; text-align:center; display: inline-block'>"+CON_AJUSTE_REDONDEO.truncarDecimal(totalfinal)+"</span>\",\"TITULOS\":\"<span style=' width:120px; text-align:center; display: inline-block'>"+de+"</span>\"}";
        else
           return "{\"VALORES\":["+html+"], \"TOTALFINAL\":\"<span  style=' width:120px; text-align:center; display: inline-block'>("+CON_AJUSTE_REDONDEO.truncarDecimal(totalfinal)+")</span>\",\"TITULOS\":\"<span style=' width:120px; text-align:center; display: inline-block'>"+de+"</span>\"}";
    }
    
    public String busquedaNivel(HttpServletRequest request, Conexion con ){
        String nivel=request.getParameter("nivel");
        String categoria=request.getParameter("categoria");
        CON_CUENTA_CONTABLE cuenta=new CON_CUENTA_CONTABLE(con);
        cuenta.setCon(con);
        String json=cuenta.busquedaNivel(nivel,categoria);
        if(json.length()>0)
        json=json.substring(0,json.length()-1);
        return "["+json+"]";
    }
   
    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
